from flask import Blueprint, request, jsonify
from ..models import User, db
from werkzeug.security import generate_password_hash, check_password_hash
from flask_jwt_extended import create_access_token, jwt_required, get_jwt_identity
from datetime import datetime

user_bp = Blueprint('user', __name__)

@user_bp.route('/register', methods=['POST'])
def register():
    data = request.get_json()
    
    # 验证必要字段
    required_fields = ['username', 'password', 'idCard', 'phone']
    for field in required_fields:
        if field not in data:
            return jsonify({
                'code': 400,
                'msg': f'缺少必要字段: {field}'
            }), 400
    
    # 检查用户是否已存在
    if User.query.filter_by(username=data['username']).first():
        return jsonify({
            'code': 400,
            'msg': '用户名已存在'
        }), 400
        
    if User.query.filter_by(idCard=data['idCard']).first():
        return jsonify({
            'code': 400,
            'msg': '身份证号已被注册'
        }), 400
        
    # 创建新用户
    user = User(
        username=data['username'],
        password=generate_password_hash(data['password']),
        idCard=data['idCard'],
        phone=data['phone'],
        birthday=datetime.now().date(),
        avatar=data.get('avatar', '/static/default-avatar.png')
    )
    
    db.session.add(user)
    db.session.commit()
    
    return jsonify({
        'code': 200,
        'msg': '注册成功',
        'data': None
    }), 200

@user_bp.route('/login', methods=['POST'])
def login():
    data = request.get_json()
    
    if not data.get('username') or not data.get('password'):
        return jsonify({
            'code': 400,
            'msg': '请提供用户名和密码'
        }), 400
        
    user = User.query.filter_by(username=data['username']).first()
    
    if not user or not check_password_hash(user.password, data['password']):
        return jsonify({
            'code': 401,
            'msg': '用户名与密码不匹配,检查是否注册或者用户名和密码错误'
        }), 401
        
    access_token = create_access_token(identity=user.id)
    return jsonify({
        'code': 200,
        'msg': '登录成功',
        'data': {
            'token': f'Bearer {access_token}',
            'user': {
                'id': user.id,
                'username': user.username,
                'role': user.role,
                'avatar': user.avatar
            }
        }
    }), 200

# 定义一个路由,用于获取用户个人资料,只接受GET请求
@user_bp.route('/profile', methods=['GET'])
# 使用jwt_required装饰器确保用户已登录
@jwt_required()
def get_profile():
    # 从JWT token中获取当前登录用户的ID
    user_id = get_jwt_identity()
    # 根据用户ID查询用户信息,如果不存在则返回404错误
    user = User.query.get_or_404(user_id)
    
    # 返回JSON格式的用户信息
    return jsonify({
        'code': 200,  # 状态码表示成功
        'msg': '获取成功',  # 成功提示信息
        'data': {
            'id': user.id,  # 用户ID
            'username': user.username,  # 用户名
            'idCard': user.idCard,  # 身份证号
            'phone': user.phone,  # 手机号
            'birthday': user.birthday.strftime('%Y-%m-%d'),  # 生日,转为YYYY-MM-DD格式
            'avatar': user.avatar,  # 头像URL
            'role': user.role,  # 用户角色
            'gender': user.gender  # 性别
        }
    }), 200  # HTTP状态码200表示请求成功

@user_bp.route('/profile', methods=['PUT'])
@jwt_required()
def update_profile():
    user_id = get_jwt_identity()
    user = User.query.get_or_404(user_id)
    
    data = request.get_json()
    
    # 添加字段验证
    if 'username' in data:
        if len(data['username']) > 50:  # 因为数据库中username字段长度为50
            return jsonify({
                'code': 400,
                'msg': '用户名长度不能超过50个字符',
                'data': None
            }), 400
        # 检查用户名是否已被其他用户使用
        existing_user = User.query.filter_by(username=data['username']).first()
        if existing_user and existing_user.id != user_id:
            return jsonify({
                'code': 400,
                'msg': '该用户名已被使用',
                'data': None
            }), 400
        user.username = data['username']
        
    if 'phone' in data:
        if not data['phone'].isdigit() or len(data['phone']) != 11:
            return jsonify({
                'code': 400,
                'msg': '请输入正确的手机号',
                'data': None
            }), 400
        user.phone = data['phone']
        
    if 'avatar' in data:
        user.avatar = data['avatar']
        
    if 'gender' in data:
        if data['gender'] not in ['男', '女']:
            return jsonify({
                'code': 400,
                'msg': '性别只能是"男"或"女"',
                'data': None
            }), 400
        user.gender = data['gender']
        
    if 'idCard' in data:
        if len(data['idCard']) != 18:
            return jsonify({
                'code': 400,
                'msg': '请输入正确的身份证号',
                'data': None
            }), 400
        # 检查身份证是否已被其他用户使用
        existing_user = User.query.filter_by(idCard=data['idCard']).first()
        if existing_user and existing_user.id != user_id:
            return jsonify({
                'code': 400,
                'msg': '该身份证号已被注册',
                'data': None
            }), 400
        user.idCard = data['idCard']
        
    if 'birthday' in data:
        try:
            user.birthday = datetime.strptime(data['birthday'], '%Y-%m-%d').date()
        except ValueError:
            return jsonify({
                'code': 400,
                'msg': '生日格式错误，应为 YYYY-MM-DD',
                'data': None
            }), 400
            
    try:
        db.session.commit()
        return jsonify({
            'code': 200,
            'msg': '个人信息更新成功',
            'data': None
        }), 200
    except Exception as e:
        db.session.rollback()
        return jsonify({
            'code': 500,
            'msg': '服务器错误',
            'data': None
        }), 500 